﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using OffInvoiceExcelAddIn.FacturaeFiles;
using OffInvoiceExcelAddIn.UBLFiles;
using System.Xml.Serialization;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using System.Xml;

namespace OffInvoiceExcelAddIn
{
    /// <summary>
    /// Clase que define el proceso de exportación de una factura
    /// </summary>
    class ExportController
    {
        #region "Fields"

        /// <summary>
        /// Campo con la cultura para el formato de los numeros, fechas y moneda
        /// </summary>
        CultureInfo cInfo = null;
        
        /// <summary>
        /// Campo con la definición de los formatos de los numero
        /// </summary>
        FieldFormats ff = null;

        /// <summary>
        /// Campo con los calculos para la generación de la factura
        /// </summary>
        Calculos calculos = null;


        #endregion

        #region "Constructor"

        /// <summary>
        /// Constructor
        /// </summary>
        public ExportController()
        {
            cInfo = new CultureInfo(Globals.ThisAddIn.Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));
            ff = new FieldFormats(cInfo, cInfo.NumberFormat, cInfo.Name);
            calculos = new Calculos(ff);
        }

        #endregion

        #region "Public Methods"

        /// <summary>
        /// Método que exporta una factura en papel
        /// </summary>
        /// <param name="path">Path donde se encuentra el xslx con la factura</param>
        /// <param name="notify">Notificación</param>
        /// <returns>La factura en papel</returns>
        public Facturae exportPaperInvoice(string path, bool notify)
        {
            try
            {
                FacturaeFieldAndValues datos = Globals.ThisAddIn.getAllData();

                FacturaeGenerator generador = new FacturaeGenerator(new Facturae(), Globals.ThisAddIn.Application.ActiveSheet, true, InvoiceTypes.FACTURAE_3_1, calculos, datos);
                Facturae paperInvoice = generador.getFacturae();

                XmlRootAttribute rootAttribute = new XmlRootAttribute();
                rootAttribute.Namespace = "http://www.facturae.es/Facturae/2007/v3.1/Facturae";
                rootAttribute.IsNullable = false;

                XmlSerializer serializer = new XmlSerializer(typeof(Facturae), rootAttribute);
                System.IO.StreamWriter w = new System.IO.StreamWriter(path);

                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                ns.Add("namespace", "http://www.facturae.es/Facturae/2007/v3.0/Facturae");
                ns.Add("", "http://www.facturae.es/Facturae/2007/v3.1/Facturae");
                ns.Add("namespace2", "http://uri.etsi.org/01903/v1.3.2#");
                ns.Add("namespace3", "http://www.w3.org/2000/09/xmldsig#");

                serializer.Serialize(w, paperInvoice, ns);
                w.Close();

                if (notify)
                {
                    ControlMessages controlM = ControlMessages.getInstance();
                    MessageBox.Show(controlM.getMessage(ControlMessages.Msg.InfoExportedInvoice), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                }
                return paperInvoice;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Método que extrae una facturae de un xlsx.
        /// </summary>
        /// <param name="path">Path donde se encuentra la factura</param>
        /// <param name="notify">Notificacion</param>
        public void extraerfacturae(string path, bool notify)
        {

            if (!string.IsNullOrEmpty(path))
            {
                Office.CustomXMLPart customPartReceived;
                try
                {
                    string customPartID = Globals.ThisAddIn.GetControlValue(ControlList.Tag.customPartId);



                    customPartReceived = Globals.ThisAddIn.Application.ActiveWorkbook.CustomXMLParts.SelectByID(customPartID);

                    if (customPartReceived != null)
                    {
                        XmlDocument doc = new XmlDocument();
                        doc.PreserveWhitespace = true;
                        doc.LoadXml(customPartReceived.DocumentElement.XML);
                        doc.Save(path);

                        if (notify)
                        {
                            ControlMessages controlM = ControlMessages.getInstance();
                            MessageBox.Show(controlM.getMessage(ControlMessages.Msg.InfoExportedInvoice), controlM.getMessage(ControlMessages.Msg.CaptionFacturae), MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                        }

                    }
                    else
                    {
                        throw new Exception();
                    }
                }

                catch (Exception e) { throw e; }
            }
        }

        #endregion
    }
}
